/**
 * 二叉树剪枝
 * https://leetcode.cn/problems/pOCWxh/description/
 * 写一个方法，遍历root 传root和他的parent
 * 当p的左/右 等于0并且是 root的左右节点都为空的时 就将root删除
 */
class Solution {
    public TreeNode pruneTree(TreeNode root) {
        func(root,root);
        if(root.val == 0 && root.left == null && root.right == null) {
            return null;
        }
        return root;
    }

    private void func(TreeNode root,TreeNode parent) {
        if(root == null) {
            return ;
        }
        func(root.left,root);
        func(root.right,root);
        if(root.val == 0 && root.left == null && root.right == null) {
            if(root == parent.left) {
                parent.left = null;
            }else {
                parent.right = null;
            }
        }
    }
}

/**
 * 官方题解
 * 官方题解，官方的题解是，将root 的左右子树拿去递归，当左右子树满足 等于0 并且左右子树都为空时返回 null
 *          如果不满足就把左右子树传回
 */
class Solution2 {
    public TreeNode pruneTree(TreeNode root) {
        if (root == null) {
            return null;
        }
        root.left = pruneTree(root.left);
        root.right = pruneTree(root.right);
        if (root.left == null && root.right == null && root.val == 0) {
            return null;
        }
        return root;
    }
}
